package xorm

/*
xorm提供了一些动态获取和修改表结构的方法，通过这些方法可以动态同步数据库结构，导出数据库结构，导入数据库结构
*/

// 一. 获取数据库信息
//	1. engine.DBMetas()：xorm支持获取表结构信息，通过调用engine.DBMetas()可以获取到数据库中所有的表，字段，索引的信息；
//	2. engine.TableInfo(bean interface{}) 根据传入的结构体指针及其对应的Tag，提取出模型对应的表结构信息。这里不是数据库
// 	   当前的表结构信息，而是我们通过struct建模时希望数据库的表的结构信息

// 二. 表操作
//	1. engine.CreateTables()：参数为一个或多个空的对应Struct的指针。同时可用的方法有Charset()和StoreEngine()，如果对应的数据库支持，
//     这两个方法可以在创建表时指定表的字符编码和使用的引擎。Charset()和StoreEngine()当前仅支持Mysql数据库
//	2. engine.IsTableEmpty()：判断表是否为空，参数和CreateTables相同
//	3. engine.IsTableExist()：判断表是否存在；
//  4. engine.DropTables()：删除表。参数为一个或多个空的对应Struct的指针或者表的名字。如果为string传入，则只删除对应的表，
//     如果传入的为Struct，则删除表的同时还会删除对应的索引

// 三. 创建索引和唯一索引
//	1. CreateIndexes：根据struct中的tag来创建索引；
//	2. CreateUniques：根据struct中的tag来创建唯一索引

// 四. 同步数据库结构
// 同步能够部分智能的根据结构体的变动检测表结构的变动，并自动同步。目前有两个实现：
//	1.Sync：
// 		· 自动检测和创建表，这个检测是根据表的名字；
//		· 自动检测和新增表中的字段，这个检测是根据字段名；
//		· 自动检测和创建索引和唯一索引，这个检测是根据索引的一个或多个字段名，而不根据索引名称
//		· 调用方法如下：err := engine.Sync(new(User), new(Group))
//	2. Sync2。Sync2对Sync进行了改进，目前推荐使用Sync2。Sync2函数将进行如下的同步操作：
//		· 自动检测和创建表，这个检测是根据表的名字；
//		· 自动检测和新增表中的字段，这个检测是根据字段名，同时对表中多余的字段给出警告信息；
//		· 自动检测，创建和删除索引和唯一索引，这个检测是根据索引的一个或多个字段名，而不根据索引名称。因此这里需要注意，
//		   如果在一个有大量数据的表中引入新的索引，数据库可能需要一定的时间来建立索引；
//		· 自动转换varchar字段类型到text字段类型，自动警告其它字段类型在模型和数据库之间不一致的情况；
//		· 自动警告字段的默认值，是否为空信息在模型和数据库之间不匹配的情况；
//		· 以上这些警告信息需要将engine.ShowWarn 设置为 true 才会显示；
//		· 调用方法和Sync一样：err := engine.Sync2(new(User), new(Group))

// 五. 导入导出SQL脚本
//	1. Dump数据库结构和数据
//		· 如果需要在程序中Dump数据库的结构和数据可以调用：engine.DumpAll(w io.Writer) 或 engine.DumpAllFile(fpath string)；
//		· DumpAll方法接收一个io.Writer接口来保存Dump出的数据库结构和数据的SQL语句，这个方法导出的SQL语句并不能通用。
//	       只针对当前engine所对应的数据库支持的SQL
//	2. Import 执行数据库SQL脚本
//		· 如果你需要将保存在文件或者其它存储设施中的SQL脚本执行，那么可以调用：engine.Import(r io.Reader) 或 engine.ImportFile(fpath string)
//		· 同样，这里需要对应的数据库的SQL语法支持
